package com.yuyue.springFramework.note10;

import com.yuyue.springFramework.note10.entity.MyConfig;
import com.yuyue.springFramework.note10.entity.MyConfigFromDB;
import com.yuyue.springFramework.note10.entity.MyConfigReloadable;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Locale;

/**
 * 《Spring-10 国际化》文章代码
 *  文章地址：https://mp.weixin.qq.com/s/Plf3g4sXyDr0RmkIrDVPUg
 *
 * spring中国际化是通过MessageSource这个接口来支持的
 * 常见3个实现类
 * ResourceBundleMessageSource
 * 这个是基于Java的ResourceBundle基础类实现，允许仅通过资源名加载国际化资源
 * ReloadableResourceBundleMessageSource
 * 这个功能和第一个类的功能类似，多了定时刷新功能，允许在不重启系统的情况下，更新资源的信息
 * StaticMessageSource
 * 它允许通过编程的方式提供国际化信息，一会我们可以通过这个来实现db中存储国际化信息的功能。
 */
public class Note10Test {
    @Test
    /**
     * 简单国际化信息获取
     * 步骤一：创建国际化文件，创建 message.properties(默认)、message_zh_CN.properties(中文【中国】)、message_en_GB.properties(英文【英国】)
     * 步骤二：向容器中注册一个MessageSource类型的bean，bean名称必须为：messageSource
     * 步骤三：调用AbstractApplicationContext中的getMessage来获取国际化信息，其内部将交给第二步中注册的messageSource名称的bean进行处理
     *
     * java中使用 java.util.Locale 来表示地区语言这个对象，内部包含了国家和语言的信息。
     */
    public void fun1(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(MyConfig.class);
        applicationContext.refresh();

        //第一行未指定Locale，此时系统会取默认的locale对象，本地默认的值中文【中国】，即：
        //zh_CN，所以会获取到 message_zh_CN.properties 中的内容。
        System.out.println(applicationContext.getMessage("name", null, null));
        System.out.println(applicationContext.getMessage("name", null, Locale.CHINA));
        System.out.println(applicationContext.getMessage("name", null, Locale.UK));
    }

    @Test
    /**
     * 绑定参数
     */
    public void fun2(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(MyConfig.class);
        applicationContext.refresh();

        //获取国际化消息
        System.out.println(applicationContext.getMessage("personal_introduction", new String[]{"鱼","跃","啊"}, null));
        System.out.println(applicationContext.getMessage("personal_introduction", new String[]{"鱼","跃","啊"}, Locale.CHINA));
        System.out.println(applicationContext.getMessage("personal_introduction", new String[]{"鱼","跃","啊"}, Locale.UK));
    }

    @Test
    /**
     * 监控国际化文件的变化
     */
    public void fun3() throws InterruptedException {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(MyConfigReloadable.class);
        applicationContext.refresh();

        //在IDEA测试时，需要修改 target 路径下的国际化文件，国际化Bean监控的是其时间戳是否发生变化!!!!
        for (int i=0; i < 1000; i++){
            System.out.println(applicationContext.getMessage("name", null, Locale.CHINA));

            Thread.sleep(20);
        }
    }

    @Test
    /**
     * 模拟从数据库中获取国际化信息
     */
    public void fun4(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(MyConfigFromDB.class);
        applicationContext.refresh();

        System.out.println(applicationContext.getMessage("desc", null, Locale.CHINA));
        System.out.println(applicationContext.getMessage("desc", null, Locale.UK));
    }
}
